// 文件名：map_scheduler.cpp
// 目的：基于 std::map 的“时间 -> 任务”调度队列，按时间窗口选出到期任务并执行。
// 关键点：
//   - 使用 steady_clock 作为时间源，避免系统时间跳变影响；
//   - upper_bound(cutoff) 取得“截止时间（不含）”的上界迭代器；
//   - 从 begin 到 end 区间遍历执行，并在执行后就地 erase（使用返回值安全前进）。
// 输出：打印 6 秒内到期的任务名称并执行其 action。

#include <chrono>
#include <functional>
#include <iostream>
#include <map>
#include <string>

struct Task {
    std::string name;
    std::function<void()> action;
};

int main() {
    using Clock = std::chrono::steady_clock;
    std::map<Clock::time_point, Task> schedule;

    auto now = Clock::now();
    schedule.emplace(now + std::chrono::seconds(3),
                     Task{"warmup", [] { std::cout << "Warmup\n"; }});
    schedule.emplace(now + std::chrono::seconds(5),
                     Task{"ping", [] { std::cout << "Ping upstream\n"; }});
    schedule.emplace(now + std::chrono::seconds(9),
                     Task{"snapshot", [] { std::cout << "Snapshot metrics\n"; }});

    auto cutoff = now + std::chrono::seconds(6);
    auto end = schedule.upper_bound(cutoff);

    std::cout << "Tasks due within 6s:\n";
    for (auto it = schedule.begin(); it != end; ) {
        std::cout << "  " << it->second.name << '\n';
        it->second.action();
        it = schedule.erase(it);
    }
    return 0;
}